JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题

JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题

因为java的8种基本数据类型中有6种是数字型的,所以他们的包装类都是继承于Object类下的Number类,所以调用以下的方法可以将任意数字型包装类转换成任意数字型基本数据。
数字型包装类的继承树
源码中Integer类中常量的定义以及它的范围

在这里插入图片描述

自动装箱及拆箱问题

比如:
Integer i = 10;
在这里 i 是 Integer类的一个引用,是不能被赋值整型的,在JDK1.5之前编译是会被编译器报错的,在JDK1.5之后编译器会自动帮我们装箱和拆箱所以不会报错,其实质是编译器帮我们把 Integer i = 10; 转换成了 Integer i = Integer.valueOf(10); 最后在JVM中看到的就是后面的这种形式,所以能正常运行。
拆箱和装箱一样,比如 :

Integer int1 = Integer.valueOf(10);
int int2 = int1;
这样现在也不会报错,编译时编译器自动帮我们把 int int2 = int1; 改成了 int int2 = int1.intValue();了。

包装类的缓存问题

看一下如下代码:

Integer d1 = 1000;
Integer d2 = 1000;

Integer d3 = 100;
Integer d4 = 100;

System.out.println(d1==d2);

在这里大家都知道应该是false,因为d1和d2是两个对象的引用,这里比较的是他们的引用,也就是对象的地址是不是相同,他们是不同的,所以这里是false。
System.out.println(d1.equals(d2));
这个是比值的所以返回的自然是true。

那么再看一下下面这个,答案输出的竟然是true?!!!
System.out.println(d3==d4);

那么为什么会是这样的呢?
我们知道 Integer d3=100;实际上是 Integer d3 = valueOf(100);
我们可以看一下valueOf()的源码
valueOf()源码
可以看到如果传入的整数在[IntegerCache.low, InterCache.high]区间时,会直接返回IntegerCache.cache数组中的元素。那么IntegerCache.low和InterCache.high分别是多少呢?IntegerCache.cache数组中的元素又是多少呢?

low and high and cache
high

cache

可以看到cache数组已经初始化[-128,127],所以如果传入的数是个整数且这个数[-128,127],那么valueOf() 就会直接返回cache数组对于的元素,他们在cache数组中是唯一且不变的,可以看到cache数组是用final修饰的,所以当传入的整数在[-128,127]时,返回的总是cache数组中的同一个地址,所以d3==d4。

下面时整合在一起的代码和运行结果,可以看一下

用法见如下代码:

	public static  void main(String [] args) {
        //基本数据类型转为对象
        Integer i = new Integer(100); //jdk9以后废弃,还能用
        Integer i2 = Integer.valueOf(150); //现在一般用这个

        // 包装类对象转为基本数据类型
        double d = i2.doubleValue();
        // 将字符串庶长子转为包装类对象
        Integer i3 = Integer.valueOf("123");
        Integer i4 = Integer.parseInt("123");

        //将包装类对象转成字符串
        String str = i3.toString();

        //一些常用的常量
        System.out.println(Integer.MAX_VALUE);  //2147483647
        System.out.println(Integer.MIN_VALUE);  //-2147483648

        //自动装箱
        Integer a = 300; // 编译器帮你改成:Integer a = Integer.valueOf(300);

        //自动拆箱
        int b = a;  // 编译器帮你改成:a.intValue();

        //包装类的缓存问题
        Integer d1 = 4000;
        Integer d2 = 4000;

        //当数字在[-128,127]之间的时候,返回缓存数组中的某个元素。
        Integer d3 = 123;
        Integer d4 = 123;

        System.out.println(d1 == d2);
        System.out.println(d3 == d4);
        System.out.println(d1.equals(d2));

     }

代码运行结果如下:
在这里插入图片描述

码字不易,转载请注明出处,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值